3장. 답을 채점하는 법

출처: 『AI 엔지니어링』(Chip Huyen 지음, 한국어판) | 원서 3장 대응 (평가 방법론)

코드는 분위기만 — Python·import 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.

0장에서 평가는 "이 책의 심장"이라고 했다.

잘 만들었는지 모르면 고칠 수도 없기 때문이다.

이 장은 그 채점을 실제로 어떻게 하는지 다룬다.

천천히 따라오면 된다.


0. 이 장의 새 단어

0장 용어집에 없는 말은 이 세 개뿐이다.

각 단어는 [한 문장 뜻 + 일상비유 + 한 줄 예] 3종으로 적었다.

막히면 여기로 돌아오면 된다.


채점 기준(criteria)

한 문장 뜻 — 모델 답이 좋은지 나쁜지 가르는 잣대. "사실과 맞는가", "질문과 관련 있는가" 같은 것.

일상비유 — 시험 채점표. 채점표가 또렷하면 누가 채점해도 같은 점수가 나오고, 흐릿하면 사람마다 점수가 들쭉날쭉이다.

한 줄 예 —

# 무엇을 보고 채점할지 정해 둔 잣대
score = grade(answer, 기준="사실과 맞는가")

AI 평가자(LLM-as-judge)

한 문장 뜻 — 다른 AI의 답을 사람 대신 채점해 주는 AI. 채점도 AI에게 시키는 것.

일상비유 — 채점을 맡긴 조교. 사람이 일일이 채점하면 느리고 비싸니, 똘똘한 조교(AI)에게 채점표를 쥐여 주고 대신 매기게 한다.

한 줄 예 —

# 답 채점을 사람이 아니라 AI에게 시킴
verdict = ai_judge.grade(answer, 기준="질문과 관련 있는가")

편향(bias)

한 문장 뜻 — 채점자가 답의 진짜 품질과 상관없는 것에 휘둘려 점수를 한쪽으로 기울이는 버릇.

일상비유 — 글씨 예쁜 답안에 후하게 주는 선생님. 내용이 아니라 길이·순서·글씨 같은 곁가지에 점수가 흔들리는 것.

한 줄 예 —

# 답이 길다는 이유만으로 더 높은 점수를 줌(장황성 편향)
# 짧고 정확한 답 < 길고 부정확한 답  ← 잘못된 채점

(귀납 도입) 이런 적 있죠?

챗봇을 1년째 돌리고 있는데, 이게 잘 답하는 건지 아무도 모른다.

"좋아 보인다"는 느낌만 있고, 점수가 없다.

그래서 어디를 고쳐야 할지도 모른다.

답답해서 직접 채점을 해 보려고 한다.

그런데 막상 해 보니 객관식이 아니다.

# 객관식이면 이렇게 끝
answer == "파리"   # 정답이면 True, 끝

같은 질문 "이 글 요약해줘"에 멀쩡한 답이 수십 개나 나온다.

어느 게 정답이라고 딱 정할 수가 없다.

이렇게 정답이 하나가 아니라 여러 개라서 채점이 어려운 일, 그게 바로 AI 답을 채점하는 일이다.

그리고 모델이 똑똑해질수록 채점은 더 어려워진다.

초등 산수 오류는 누구나 잡지만, 박사급 답의 오류는 박사라야 잡는다.

그래서 채점에는 요령이 필요하다.

이 장은 그 요령 다섯 가지를 차례로 본다.


이 장에서 딱 5가지만

채점이 왜 어려운가 — AI 답은 정답이 여러 개라 객관식처럼 못 채점한다.

진짜 되는지 보기 — 답이 예뻐 보이는지 말고, 실제로 돌아가는지(테스트 통과)로 채점한다.

말 말고 뜻으로 비교 — 단어가 달라도 뜻이 같으면 맞게 봐 준다.

AI에게 채점 시키기 — 사람 대신 AI가 채점한다. 단, 편향에 휘둘린다.

둘을 맞붙여 비교 — 점수를 매기기 어려우면, 두 답을 나란히 놓고 "어느 쪽이 나은지"만 고른다.


학습 목표

이 장을 끝내면 다음을 할 수 있다.

  • AI 답 채점이 객관식보다 어려운 이유를 설명한다.
  • 답이 "진짜 되는지"로 채점하는 방식을 설명한다.
  • 단어 비교와 뜻 비교의 차이를 구분한다.
  • AI 평가자가 무엇이고 어떤 편향에 휘둘리는지 구분한다.
  • 점수 매기기 대신 둘을 맞붙여 비교하는 방식을 설명한다.

개념 1 — 진짜 되는지로 채점한다 (기능적 정확성)

망가지는 장면

AI가 짜 준 코드를 봤더니, 줄도 깔끔하고 주석도 예쁘다.

"잘 짰네" 하고 그대로 가져다 썼다.

그런데 실행하니 결과가 틀렸다.

예뻐 보인다고 잘 도는 건 아니었다.

일상비유

요리 채점. 플레이팅이 예쁜 것과 맛이 있는 건 다른 문제다.

먹어 봐야(돌려 봐야) 진짜 점수가 나온다.

코드라면 "예쁜가"가 아니라 "테스트를 통과하는가"로 채점하는 것이다.

비유 코드 위험
먹어 보고 채점(돌려 봄) 테스트 모두 통과하면 정답 안전 — 진짜 되는지로 채점
눈으로만 채점(안 돌려 봄) 코드가 깔끔해 보이면 정답 예뻐도 틀린 답을 합격시킴

한 문장 정의 — 기능적 정확성은 답이 예뻐 보이는지가 아니라 실제로 의도한 일을 해내는지(테스트 통과 여부)로 채점하는 방식이다.

가장 단순한 규칙은 이렇다. 돌려 볼 수 있으면 돌려 보고 채점한다. 눈으로만 보지 않는다.

예시 폭격

예시 ① — 완성예 (worked-example, 빈칸 없음)

AI가 "두 수를 더하는 함수"를 짜 줬다.

채점은 눈이 아니라 테스트로 한다.

def add(a, b):
    return a + b

# 채점: 정해 둔 테스트를 통과하나?
assert add(2, 3) == 5      # 통과
assert add(0, 0) == 0      # 통과
# 둘 다 통과 → 합격

테스트를 다 통과했으니 합격이다.

코드가 예뻐서가 아니라, 진짜 돌아가서 합격이다.

예시 ② — 부분완성 (빈칸 채우기)

이번엔 "리스트에서 가장 큰 수"를 채점한다.

빈칸 한 군데를 직접 채워 보자.

def biggest(nums):
    return max(nums)

# 채점 기준: 아래가 둘 다 통과해야 합격
assert biggest([1, 9, 3]) == ____   # 빈칸: 답은?
assert biggest([5]) == 5            # 통과

빈칸의 답은 9다.

[1, 9, 3] 중 가장 큰 수가 9이기 때문이다.

이렇게 기댓값을 미리 적어 두고, 통과하면 합격으로 본다.

예시 ③ — 독립 적용 (혼자 해 보기)

AI에게 "짝수만 골라내는 함수"를 시켰다고 하자.

채점 테스트를 직접 한 줄 떠올려 보자.

힌트: 입력 [1, 2, 3, 4]를 넣으면 무엇이 나와야 하는가?

답 — [2, 4]가 나와야 한다.

그래서 assert pick_even([1,2,3,4]) == [2,4] 같은 테스트로 채점하면 된다.

이게 통과하면 합격, 아니면 불합격이다.

before / after

# before — 눈으로만 보고 합격시킴
"코드 깔끔하네, 합격!"        # 돌려 보지 않음 → 틀려도 통과

# after — 테스트로 채점
assert add(2, 3) == 5         # 진짜 되는지 확인 후 합격

미니 시나리오

"이럴 때 이렇게" — AI가 짠 코드를 받았다면?

먼저 통과해야 할 테스트 두세 개를 정한다.

그다음 코드를 돌려서 다 통과하면 합격, 하나라도 막히면 불합격으로 친다.

한 걸음 더 ▸ (지금 몰라도 됨)

"여러 번 시도해서 한 번이라도 통과하면 봐 주기" 같은 방식(여러 후보 중 하나만 맞아도 OK)도 있다. 지금은 "돌려 봐서 통과하면 합격" 하나만 들고 가면 된다.


개념 2 — 말 말고 뜻으로 비교한다 (단어 비교 vs 뜻 비교)

망가지는 장면

모범답안은 "잘 지냈어?"였다.

AI는 "요즘 어떻게 지내?"라고 답했다.

뜻은 같은데, 겹치는 단어가 적다는 이유로 오답 처리됐다.

맞는 답이 틀렸다고 깎인 것이다.

일상비유

받아쓰기 채점 vs 뜻 채점.

받아쓰기는 글자가 똑같아야 맞다.

하지만 작문은 단어가 달라도 뜻이 통하면 맞다.

AI 답은 작문 쪽이라, 단어만 맞춰 보면 멀쩡한 답을 자꾸 떨어뜨린다.

비유 코드 위험
뜻으로 채점 뜻이 가까우면 정답 안전 — 단어 달라도 봐 줌
단어 겹침으로만 채점 겹친 단어 수 / 전체 뜻 같아도 단어 다르면 오답 처리

여기서 "뜻이 가깝다"는 건 0장의 임베딩으로 잰다.

임베딩은 뜻을 숫자 좌표로 바꾼 것이라, 좌표가 가까우면 뜻이 비슷하다고 본다.

한 문장 정의 — 단어 비교는 겹친 단어 수로 채점하고, 뜻 비교는 임베딩 좌표가 얼마나 가까운지로 채점한다.

가장 단순한 규칙. 짧고 딱 떨어지는 답이면 단어 비교로 충분하고, 길고 자유로운 답이면 뜻 비교가 안전하다.

예시 폭격

예시 ① — 완성예 (단어 겹침 세기)

모범답안과 AI 답에서 겹치는 단어를 세 본다.

ref = "나는 고양이를 키운다"      # 모범답안
ans = "나는 고양이를 좋아한다"    # AI 답

# 겹치는 단어: 나는, 고양이를 → 2개
# 전체 단어 3개 기준 → 2/3 ≈ 0.67 (꽤 비슷)

겹친 단어가 많으니 단어 비교 점수가 높게 나온다.

예시 ② — 부분완성 (빈칸 채우기)

이번엔 단어가 거의 안 겹치는 경우다.

ref = "잘 지냈어?"
ans = "요즘 어떻게 지내?"

# 겹치는 단어: ____  (직접 세 보기)
# → 사실상 거의 없음 (단어 비교 점수 낮음)
# 하지만 뜻은? → ____ (같다 / 다르다)

빈칸 1: 겹치는 단어는 거의 없다.

빈칸 2: 뜻은 같다.

그래서 단어 비교는 낮은 점수를 주지만, 뜻 비교는 높은 점수를 줘야 맞다.

예시 ③ — 독립 적용 (혼자 골라 보기)

다음 두 쌍 중 어느 쪽을 뜻 비교로 채점해야 안전할까?

(가) "2+2는?" → 답 "4"

(나) "이 영화 어땠어?" → 답 "재밌더라 / 시간 가는 줄 몰랐어"

답 — (나)다.

(가)는 답이 딱 하나라 단어 비교로 충분하지만, (나)는 같은 뜻을 여러 말로 표현하니 뜻 비교가 안전하다.

before / after

# before — 단어만 보고 채점
"잘 지냈어?" vs "요즘 어떻게 지내?"   # 단어 안 겹침 → 오답(틀린 채점)

# after — 뜻으로 채점
뜻 좌표가 가까움 → 정답              # 단어 달라도 봐 줌

미니 시나리오

"이럴 때 이렇게" — 답이 자유로운 문장(요약·번역·감상)이라면?

단어 겹침만 보지 말고, 뜻이 가까운지(임베딩)로 함께 채점한다.

한 걸음 더 ▸ (지금 몰라도 됨)

단어 비교에도 종류가 여럿이고, 뜻 비교는 좌표 품질에 점수가 휘둘린다. 지금은 "짧은 답은 단어, 자유로운 답은 뜻" 규칙 하나면 된다.


개념 3 — AI에게 채점을 시킨다 (AI 평가자)

망가지는 장면

답이 수천 개라 사람이 일일이 채점하다가 지쳤다.

비싸고, 느리다.

그래서 채점을 AI에게 맡겼다.

그런데 AI가 내용이 부실해도 길기만 하면 후한 점수를 줬다.

엉뚱한 데서 점수가 새고 있었다.

일상비유

채점을 맡긴 조교.

조교(AI)는 빠르고 싸다.

하지만 곁가지에 잘 휘둘린다 — 길이·순서 같은 것에.

채점표(기준)를 또렷이 쥐여 주지 않으면 엉뚱하게 매긴다.

비유 코드 위험
또렷한 채점표 쥐여 줌 ai_judge.grade(답, 기준="길이 말고 관련성") 안전 — 곁가지에 덜 휘둘림
채점표 없이 맡김 ai_judge.grade(답) 길이·순서 같은 편향에 휘둘림

여기서 AI가 휘둘리는 버릇이 0절에서 본 편향이다.

자주 나오는 편향 세 가지만 보자.

  • 길이 편향 — 내용과 상관없이 긴 답을 더 좋게 본다.
  • 순서 편향 — 두 답 중 앞에 놓인 답을 더 좋게 본다.
  • 제 식구 편향 — 자기가 만든 답을 더 좋게 본다.

한 문장 정의 — AI 평가자는 채점을 사람 대신 AI에게 맡기는 방식이며, 빠르고 싸지만 길이·순서 같은 편향에 휘둘린다.

가장 단순한 규칙. 채점표(기준)를 또렷이 적어 주고, 순서를 바꿔 두 번 채점해 본다.

예시 폭격

예시 ① — 완성예 (또렷한 채점표)

AI에게 채점을 시킬 때, 무엇을 보고 매길지 콕 집어 준다.

기준 = "답 길이 말고, 질문과 얼마나 관련 있는지로만 점수를 매겨라"
점수 = ai_judge.grade(질문, 답, 기준)
# 길이에 휘둘리지 말라고 미리 못박음

채점표가 또렷하니 곁가지에 덜 흔들린다.

예시 ② — 부분완성 (순서 편향 잡기)

AI는 앞에 놓인 답을 더 좋게 보는 버릇이 있다.

그래서 순서를 바꿔 두 번 매긴다.

점수1 = ai_judge.compare(답A, 답B)   # A를 앞에
점수2 = ai_judge.compare(답B, 답A)   # B를 앞에 (순서 바꿈)

# 두 번 다 같은 답을 고르면 → ____ (믿을 만 / 못 믿음)
# 순서 바꾸니 답이 뒤집히면 → ____ (믿을 만 / 못 믿음)

빈칸 1: 두 번 다 같은 답이면 믿을 만하다.

빈칸 2: 순서만 바꿨는데 답이 뒤집히면 못 믿는다 — 순서 편향에 휘둘린 것이다.

예시 ③ — 독립 적용 (혼자 진단)

AI 평가자가 짧고 정확한 답보다, 길지만 틀린 답에 높은 점수를 줬다.

어떤 편향일까?

답 — 길이 편향이다.

내용이 아니라 길이에 휘둘렸기 때문이다.

이럴 땐 "길이 말고 정확성으로 매겨라"라고 채점표를 고쳐 준다.

before / after

# before — 그냥 맡김
ai_judge.grade(답)             # 길면 후하게 줌(길이 편향)

# after — 채점표 + 순서 교차
ai_judge.grade(답, 기준="길이 말고 관련성")
ai_judge.compare(답B, 답A)     # 순서 바꿔 한 번 더

미니 시나리오

"이럴 때 이렇게" — 답이 너무 많아 AI에게 채점을 맡긴다면?

채점표를 또렷이 적어 주고, 두 답을 비교할 땐 순서를 바꿔 두 번 매겨 본다.

한 걸음 더 ▸ (지금 몰라도 됨)

AI 채점은 같은 답에도 매번 점수가 조금씩 흔들리고, 특정 기준에만 잘하는 전용 채점 AI도 따로 있다. 지금은 "채점표 또렷이 + 순서 바꿔 두 번" 규칙이면 된다.


개념 4 — 둘을 맞붙여 비교한다 (비교 평가)

망가지는 장면

답에 정확한 점수를 매기려니 너무 어렵다.

"이 답은 7.5점인가 8점인가?" 같은 게 영 모호하다.

그런데 두 답을 나란히 놓고 보니 "이게 더 낫네"는 쉽게 골라졌다.

점수 매기기는 어려운데, 둘 중 고르기는 쉬웠던 것이다.

일상비유

노래 채점 vs 노래 대결.

노래 하나에 "87점" 매기긴 어렵다.

하지만 두 노래를 듣고 "이쪽이 더 좋다" 고르긴 쉽다.

모델도 점수보다 맞대결이 쉬울 때가 많다.

비유 코드 위험
맞대결로 고름 더_나은_쪽 = vote(답A, 답B) 쉬움 — 주관적 품질에 잘 맞음
각자 점수 매김 점수 = grade(답) 절대 점수라 모호할 때 흔들림

한 문장 정의 — 비교 평가는 각 답에 점수를 매기는 대신 두 답을 나란히 놓고 더 나은 쪽을 고르게 해서 순위를 매기는 방식이다.

가장 단순한 규칙. 점수 매기기가 모호하면, 둘을 맞붙여 "어느 쪽이 나은지"만 고른다.

예시 폭격

예시 ① — 완성예 (맞대결 한 판)

같은 질문에 두 모델이 답했다.

점수 대신 더 나은 쪽에 한 표를 준다.

질문 = "이 글 세 줄로 요약해줘"
답A = model_A.run(질문)
답B = model_B.run(질문)

승자 = vote(답A, 답B)   # 더 나은 쪽에 한 표
# 이런 투표를 잔뜩 모으면 순위가 나옴

투표를 많이 모을수록 순위가 또렷해진다.

예시 ② — 부분완성 (왜 맞대결인지)

비교 평가에는 좋은 점이 하나 있다.

# 점수 벤치마크: 모델이 만점 받으면 ____ (계속 쓸 만 / 쓸모없어짐)
# 맞대결: 더 센 모델이 나와도 둘 중 나은 쪽은 여전히 고를 수 있음

빈칸: 점수 벤치마크는 만점을 받으면 쓸모없어진다.

하지만 맞대결은 더 센 모델이 나와도 "둘 중 어느 쪽이 나은지"는 계속 고를 수 있어 낡지 않는다.

예시 ③ — 독립 적용 (혼자 판단)

답 품질이 주관적인 일(예: "이 카피 중 어느 게 더 매력적인가")이 있다.

점수 매기기와 맞대결 중 어느 쪽이 쉬울까?

답 — 맞대결이다.

"몇 점짜리인가"보다 "둘 중 어느 쪽이 나은가"가 고르기 쉽기 때문이다.

before / after

# before — 각자 절대 점수 (모호함)
점수A = grade(답A)   # 7.5? 8? 애매
점수B = grade(답B)

# after — 맞대결 (고르기 쉬움)
승자 = vote(답A, 답B)   # 더 나은 쪽만 고름

미니 시나리오

"이럴 때 이렇게" — 답에 점수를 매기기가 영 모호하다면?

두 답을 나란히 놓고 "어느 쪽이 더 나은지"만 고른 뒤, 그런 투표를 잔뜩 모아 순위를 낸다.

한 걸음 더 ▸ (지금 몰라도 됨)

맞대결은 모델이 많아지면 비교할 짝이 확 늘고, "더 낫다"만 알지 "충분히 좋은지"는 못 알려준다. 지금은 "점수가 모호하면 맞대결" 하나면 된다.


정리

핵심은 세 줄이다.

답은 정답이 여럿이라 객관식처럼 못 채점한다 — 그래서 요령이 필요하다.

예뻐 보이는지 말고 진짜 되는지(테스트), 단어 말고 뜻(임베딩)으로 채점한다.

채점이 너무 많으면 AI에게 맡기되 편향을 조심하고, 점수가 모호하면 둘을 맞붙여 고른다.

가장 단순하게 들고 갈 규칙 하나. 돌려 볼 수 있으면 돌려 보고, 점수가 모호하면 맞대결로 고른다.

다음 4장에서는 이 채점법으로 우리 일에 맞는 모델을 어떻게 고르는지 본다. (지금 몰라도 됩니다 — 4장에서 풀려요.)

난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플